﻿namespace LM.Negocio.Validadores
{
    using LM.InterfacesFabricas.Interfaces.Repositorios;
    using System;
    using System.Linq;

    public class ValidadorDeVaga : ValidadorAbastrato
    {
        private Vaga _objetoValidado;

        private IRepositorioDeConsultaDeObjetos<Vaga> _repositorioDeVaga;

        public ValidadorDeVaga(IRepositorioDeConsultaDeObjetos<Vaga> repositorioDeVaga)
        {
            if (repositorioDeVaga == null)
            {
                throw new ArgumentNullException("repositorioDeVaga");
            }

            _repositorioDeVaga = repositorioDeVaga;
        }

        public void ValideCadastro(Vaga vaga)
        {
            if (vaga == null)
            {
                throw new ArgumentException("vaga");
            }

            _objetoValidado = vaga;
            base.LimpeInconsistencias();

            ValideCodigoNaoInformado();
            ValideNumeroNaoInformado();
            ValideTipoNaoInformado();
            ValideVagaJaCadastrada();

            base.GarantaSucesso();
        }

        public void ValideAtualizacao(Vaga vaga)
        {
            if (vaga == null)
            {
                throw new ArgumentException("vaga");
            }

            _objetoValidado = vaga;
            base.LimpeInconsistencias();

            ValideCodigoNaoInformado();
            ValideNumeroNaoInformado();
            ValideTipoNaoInformado();
            ValideVagaJaCadastrada();

            base.GarantaSucesso();
        }

        public void ValideExclusao(Vaga vaga)
        {
            if (vaga == null)
            {
                throw new ArgumentException("vaga");
            }

            _objetoValidado = vaga;
            base.LimpeInconsistencias();

            ValideVagaNaoCadastrada();

            base.GarantaSucesso();
        }

        private void ValideCodigoNaoInformado()
        {
            if (_objetoValidado.Codigo == 0)
            {
                AdicioneInconsistencia("Código não informado.");
            }
        }

        private void ValideNumeroNaoInformado()
        {
            if (_objetoValidado.Numero ==0)
            {
                AdicioneInconsistencia("Número não informado.");
            }
        }

        private void ValideTipoNaoInformado()
        {
            if (String.IsNullOrWhiteSpace(_objetoValidado.Tipo))
            {
                AdicioneInconsistencia("Tipo não informado.");
            }
        }

        private bool VagaJaCadastrada()
        {
            return _repositorioDeVaga.Consulte(m => m.Codigo == _objetoValidado.Codigo).Any();
        }

        private void ValideVagaJaCadastrada()
        {
            if (VagaJaCadastrada())
            {
                AdicioneInconsistencia("Já existe uma Vaga cadastrada com o código {0}.", _objetoValidado.Codigo);
            }
        }

        private void ValideVagaNaoCadastrada()
        {
            if (!VagaJaCadastrada())
            {
                AdicioneInconsistencia("Vaga com o código {0} não cadastrada.", _objetoValidado.Codigo);
            }
        }
    }
}
